
import sys
sys.path.append('../../../')
from bot.financial_sales.agent.base_agent import LLMAgent
from common.log import logger as logging
import asyncio
# import pandas as pd


## 7. 有无权益：有权益、无权益。已获得优惠券、已使用优惠券、已获得降息、已使用降息等表示"有权益"，其他均为"无权益"。

class UserSituation(LLMAgent):
    """抽取用户情境Agent
     1. 用户年龄：18岁以下、18-55岁、56-64岁、65以上。
    """

    user_question_v0 = """
作为专业的、非常懂营销的信贷领域的{salesperson_role}，你正通过电话和用户沟通，你的任务是根据与用户的对话来识别和判断用户当前的借款相关信息。用户信息列表可以包括以下几种：
1. 有无APP：未知,未安装APP,有京东APP,有京东金融APP。
2. 是否已打开APP：未打开APP,已打开APP。
注意事项:
1.输出格式为通过","拼接的value值，如：有京东APP,已打开APP，若只有一个有值，则返回该结果，空返回无
2.这是一个语音对话的场景，可能存在一些语音识别的错误，比如文本中的"那个"实际可能是"哪个"，你需要兼容这种错误正确识别出用户的信息。
3.有意愿打开APP的用户参加活动，只是代表用户有意愿参加活动，不代表用户有APP。
4.用户若是对询问有app时，明确表示肯定，如"好的",”嗯“等，则表明用户有该APP
5.只有用户表示自己没有京东APP,且没有京东金融APP，才能返回"未安装APP"，单独表达自己没有京东APP或京东金融APP仍是未知
6.如果用户已经进行操作APP流程，则说明用户打开了APP
7.未知以及未明确的信息均不用返回，返回的结果只包含信息的值，不要再包含任何其他内容
以下是可供参考的示例
示例1
=====
销售员:多次使用借款有助于额度利率的再次调整，您打开app参与下用款可以吗？
用户:嗯，好，谢谢。
输出：无
=====
示例1结束
示例2
=====
销售员:使用后还有再次提升额度机会的，具体以审核为准，您打开京东app看一下好吧？
用户:好的
输出： 无
=====
示例2结束

对话记录如下：
===
{conversation_history}
===
根据对话记录和用户信息列表，一步一步推理出的用户信息：
"""

    def __init__(self, conversation_history):
        self.prompt = self.user_question_v0.format(salesperson_role='销售员', conversation_history=conversation_history)
        super().__init__(self.prompt)


async def get_user_situation(session_id, conversation_history):
    conversation = UserSituation(conversation_history)
    user_question = await conversation.achat_auto_llm(type='llm_test')
    print(f"session_id:{session_id},整理后的用户问题是:{user_question}")


class UserSituation_History_Dialogue(LLMAgent):
    """抽取用户情境Agent
     1. 用户年龄：18岁以下、18-55岁、56-64岁、65以上。
    """

#     user_question_v0 = """
# 作为专业的、非常懂营销的信贷领域的{salesperson_role}，下面会有一段你与用户的对话记录，你的任务是根据与用户的对话来识别和判断用户当前的借款相关信息。用户信息列表可以包括以下几种：
# 1. 用户是否表述在忙：未知,表述在忙。
# 2. 用户是否表述不需要：未知,表述不需要。
# 注意事项:
# 1.输出格式为通过","拼接的value值，如：表述在忙,表述不需要，若只有一个有值，则返回该结果，空返回无
# 2.这是一个语音对话的场景，可能存在一些语音识别的错误，比如文本中的"那个"实际可能是"哪个"，你需要兼容这种错误正确识别出用户的信息。
# 3.未知以及未明确的信息均不用返回，返回的结果只包含信息的值，不要再包含任何其他内容。
# 4."@@quiet@@"代表的是用户未说话，没有任何含义，如果全篇用户未说话，直接输出无。
# 5.用户明确表示出忙才能认为用户表述在忙，不可以过度推理，没说就是没有。
# 对话记录如下：
# ===
# {conversation_history}
# ===
# 根据对话记录和用户信息列表，一步一步推理出的用户信息：
# """

    user_question_v0 = """
作为专业的、非常懂营销的信贷领域的{salesperson_role}，你正通过电话和用户沟通，你的任务是根据与用户的对话来识别和判断用户当前的借款相关信息。用户信息列表可以包括以下几种：
1. 有无APP：未知,未安装APP,有京东APP,有京东金融APP。
2. 是否已打开APP：未打开APP,已打开APP。
注意事项:
1.输出格式为通过","拼接的value值，如：有京东APP,已打开APP，若只有一个有值，则返回该结果，空返回无
2.这是一个语音对话的场景，可能存在一些语音识别的错误，比如文本中的"那个"实际可能是"哪个"，你需要兼容这种错误正确识别出用户的信息。
3.有意愿打开APP的用户参加活动，只是代表用户有意愿参加活动，不代表用户有APP。
4.用户若是对询问有app时，明确表示肯定，如"好的",”嗯“等，则表明用户有该APP
5.只有用户表示自己没有京东APP,且没有京东金融APP，才能返回"未安装APP"，单独表达自己没有京东APP或京东金融APP仍是未知
6.如果用户已经进行操作APP流程，则说明用户打开了APP
7.未知以及未明确的信息均不用返回，返回的结果只包含信息的值，不要再包含任何其他内容
以下是可供参考的示例
示例1
=====
销售员:多次使用借款有助于额度利率的再次调整，您打开app参与下用款可以吗？
用户:嗯，好，谢谢。
输出：无
=====
示例1结束
示例2
=====
销售员:使用后还有再次提升额度机会的，具体以审核为准，您打开京东app看一下好吧？
用户:好的
输出： 无
=====
示例2结束

对话记录如下：
===
{conversation_history}
===
根据对话记录和用户信息列表，一步一步推理出的用户信息：
"""

    def __init__(self, conversation_history):
        self.prompt = self.user_question_v0.format(salesperson_role='销售员', conversation_history=conversation_history)
        super().__init__(self.prompt)


async def get_history_dialogue_user_situation(session_id, conversation_history):
    conversation = UserSituation_History_Dialogue(conversation_history)
    prompt = conversation.prompt
    user_question = await conversation.achat_auto_llm(type='financial_loan_7b')
    print(f"session_id:{session_id},整理后的用户问题是:{user_question}")
    return session_id, conversation_history, prompt, user_question


if __name__ == '__main__':


    deal_conversation_history = '''
销售员:您好，请问您是周先生吗？
用户:呃，你有事你说
销售员:哎您好您好，我是京东金融客户经理工号95266，给您致电是有一个好消息哈，这不是年底了嘛，咱们金条给客户送福利，给您争取到了一个额度利息的调整机会，具体以系统审核为准哈，您看您对现在的额度利息还满意吗？
用户:先不用了啊，谢谢啊。
销售员:啊那我简单跟您说一下哈就咱们金条是可以直接提现到您的银行卡里像平时旅游啊装修啊都可以使用的，您多多提现到银行卡里使用，还有助于创造额度和利率调整的机会，那您这边打开京东app然后我带您看一下好吧？
用户:先不用了，啊嗯。
销售员:理解您，其实还是建议您这次使用下账户的，因为金条会不定期更新额度和利率，用的多调整的机会就多，不用或者用的少，额度利息就不容易保留，后续您有大额用款需求，比如说有急用现金的时候万一额度不够了，也比较着急，您这次提现到银行卡使用一下，让系统能检测到咱们有持续的需求，那您现在就使用一下好吧？
'''

    loops = asyncio.get_event_loop()
    # res_user_situation = loops.run_until_complete(get_user_situation('123', deal_conversation_history,))
    session_id, conversation_history, prompt, user_question = loops.run_until_complete(get_history_dialogue_user_situation('123', deal_conversation_history, ))
    print(user_question)


    # df = pd.read_excel('/Users/yangjie/Desktop/历史对话记录1.xlsx')
    # session_ids = df["session_id"].tolist()
    # historys = df["对话记录"].tolist()
    #
    # ll = [[case_id, score] for case_id, score in zip(session_ids, historys)]
    # data = []
    # for e in ll:
    #     loops = asyncio.get_event_loop()
    #     # res_user_situation = loops.run_until_complete(get_user_situation('123', deal_conversation_history,))
    #     session_id, conversation_history, prompt, user_question = loops.run_until_complete(
    #         get_history_dialogue_user_situation(e[0], e[1], ))
    #     data.append([session_id, conversation_history, prompt, user_question])
    #     print(session_id, conversation_history, prompt, user_question)
    # target = pd.DataFrame(data=data,
    #                       columns=["session_id", "对话记录", "prompt", "用户问题"])
    # target.to_excel('/Users/yangjie/Desktop/历史对话记录-GPT-1.0.xlsx', index=False)



